/***************************************************************************************************
 *Copyright(C),2010-2016,Sumscope
 *FileName	:  date.h
 *Author	:  scofined.qi
 *Version	:  1.0
 *Date		:  2015/12/18
 *Desc		:  //用于主要说明此程序文件完成的主要功能
 *Relation :
 *Others	:  //其他内容说明
 *Function :  //主要函数列表，每条记录应包含函数名及功能简要说明
 *History	:
 * //修改历史记录列表，每条修改记录应包含修改日期、修改者及修改内容简介
 ***************************************************************************************************/
#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#include "../core.h"
#include "../strings/BaseString.h"

namespace qb {
namespace base {
time_t S_CORE_EXPORT getTimeFromInt(int date);
time_t S_CORE_EXPORT make_time(int year, int month, int day, int hour = 0,
                               int minute = 0, int second = 0);
/*
        2011-11-23
        返回当地时间0点的秒数，输入参数为gmt秒数，由time(NULL)返回 ;
        */
time_t S_CORE_EXPORT calc_date(time_t time, int& year, int& month, int& day,
                               int& wday);

struct S_CORE_EXPORT IntDate {
  static unsigned int timeToInt(time_t time);
  static time_t IntToTime(unsigned int date);
  static void UpdateCache();
};
class date {
 private:
  time_t time_;
  int year_;   // 年2011
  int month_;  // 月1...12
  int day_;    // 日期1...31
  int wday_;   // 周1...7

  BaseString datestr_;

  int calc_stage_;

 public:
  date();
  date(time_t ts);
  date(int year, int month, int day);
  void reset();

  date& operator=(time_t ts);
  bool operator==(time_t ts);
  bool operator!=(time_t ts);

  bool operator==(const date& d);
  bool operator!=(const date& d);

  bool operator<(const date& d);
  bool operator<=(const date& d);
  bool operator>(const date& d);
  bool operator>=(const date& d);

  BaseString& to_string();
  time_t time();
  time_t gmttime();
  bool calc_now();

  inline int year() const { return year_; }
  inline int month() const { return month_; }
  inline int day() const { return day_; }
  inline int wday() const { return wday_; }

  date& next_day(int dc = 1);

  static date& today();
  static int timezone();
};

class utime {
 protected:
  int hour_;
  int minute_;
  int second_;
  int usec_;

  BaseString usecstr_;

  void calcutestr();
  int calc_stage_;

 public:
  utime(bool need_calc = false);  // 支持微秒
  ~utime();

  void reset();
  /*
  2011-11-24
  micro必须是本地时间，乘以1,000,000。得到微秒
  */
  void calc_now(int64_t micro = 0);

  inline int hour() const { return hour_; }
  inline int minute() const { return minute_; }
  inline int second() const { return second_; }
  inline int usec() const { return usec_; }

  BaseString& to_string();

  static int64_t now();
  const utime& operator=(const utime& src);
};
}  // namespace base
}  // namespace qb
